package cn.likun.kit;

import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

import cn.likun.kit.validate.ValidateCommons;

/**
 *<p>properties 资源文件操作工具类</p>
 */
public class ReadResource {
	
	private static Map<String,ResourceBundle> resourceMap = new Hashtable<String,ResourceBundle>();
	/**
	 * 从指定 name 的资源文件中获取 key 对应的 value
	 * @param name 资源文件名, 不需要.properties 后缀的资源文件长命名
	 * @param key 键
	 * @param locale 语言环境
	 * @return
	 */
	public static String getValue(String name, String key ,Locale locale) {
		ResourceBundle resource = getResourceBundle(name, locale);
		String value = null;
		if (resource != null) {
			value = resource.getString(key);
		}
		return value;
	}
	
	/**
	 * <p>方法名：getValue</p>
	 * <p>描述：从指定的资源文件中获取 key 对应的 value</p>
	 * @param name 资源文件名，不需要 .properties 后缀
	 * @param key 键
	 * @return 值
	 */
	public static String getValue(String name, String key) {
		return getValue(name,key,null);
	}
	
	/**
	 * <p>从指定的资源文件中获取所有键值对</p>
	 * @param name 资源文件名 , 不需要 .properties 后缀
	 * @param locale 语言环境
	 * @return 键值对集
	 */
	public static Map<String,String> getValues(String name, Locale locale) {
		ResourceBundle resource = getResourceBundle(name, locale);
		Map<String,String> values = new HashMap<String, String>();
		if (null != resource) {
			Enumeration<String> keys = resource.getKeys();
			while (keys.hasMoreElements()) {
				String key = keys.nextElement();
				String value = getValue(name, key, locale);
				if (ValidateCommons.isNotEmpty(value)) {
					values.put(key, value);
				}
			}
		}
		return values;
	}
	/**
	 * <p>方法名：getValues</p>
	 * <p>描述：从指定的资源文件中获取所有键值对</p>
	 * @param name 资源文件名，不需要 .properties 后缀
	 * @return 键值对集
	 */
	public static Map<String,String> getValues(String name){
		return getValues(name,null);
	}
	/**
	 * 格式化资源值<br>
	 * xxx {0} xxx {1} xxx
	 * @param value 值
	 * @param args 参数列表
	 * @return 格式化后的值
	 */
	public static String formatValue(String value, Object[] args) {
		if (ValidateCommons.isNotEmpty(value)) {
			MessageFormat messageFormat = new MessageFormat(value);
			value = messageFormat.format(args);
		}
		return value;
	}
	
	
	/**
	 * 获取 ResourceBundle 的 properties
	 * @param name
	 * @param locale
	 * @return
	 */
	private static ResourceBundle getResourceBundle(String name, Locale locale) {
		ResourceBundle resource = resourceMap.get(name);
		if (null == resource) {
			if (null == locale) {
				resource = ResourceBundle.getBundle(name);
			} else {
				resource = ResourceBundle.getBundle(name,locale);
			}
			resourceMap.put(name, resource);
		}
		return resource;
	}
	
}
